package cn.iocoder.yudao.module.eval.service.monitoring;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.eval.controller.admin.monitoring.vo.*;

import javax.validation.Valid;
import java.util.List;

/**
 * 评价实施监控 Service 接口
 *
 * @author 芋道源码
 */
public interface EvalMonitoringService {

    /**
     * 获取监控仪表盘数据
     *
     * @param planId 计划ID
     * @return 仪表盘数据
     */
    EvalMonitoringDashboardRespVO getMonitoringDashboard(Long planId);

    /**
     * 获取实时状态
     *
     * @param planId 计划ID
     * @return 实时状态
     */
    EvalRealTimeStatusRespVO getRealTimeStatus(Long planId);

    /**
     * 获取评价进度
     *
     * @param planId 计划ID
     * @return 评价进度
     */
    EvalEvaluationProgressRespVO getEvaluationProgress(Long planId);

    /**
     * 考生签到
     *
     * @param checkInReqVO 签到信息
     */
    void candidateCheckIn(@Valid EvalCandidateCheckInReqVO checkInReqVO);

    /**
     * 考生签退
     *
     * @param checkOutReqVO 签退信息
     */
    void candidateCheckOut(@Valid EvalCandidateCheckOutReqVO checkOutReqVO);

    /**
     * 获取考勤统计
     *
     * @param planId 计划ID
     * @return 考勤统计
     */
    EvalAttendanceStatisticsRespVO getAttendanceStatistics(Long planId);

    /**
     * 创建督导检查记录
     *
     * @param supervisionReqVO 督导信息
     * @return 记录ID
     */
    Long createSupervisionRecord(@Valid EvalSupervisionRecordSaveReqVO supervisionReqVO);

    /**
     * 更新督导检查记录
     *
     * @param updateReqVO 更新信息
     */
    void updateSupervisionRecord(@Valid EvalSupervisionRecordSaveReqVO updateReqVO);

    /**
     * 获取督导检查记录分页
     *
     * @param pageReqVO 分页查询
     * @return 督导记录分页
     */
    PageResult<EvalSupervisionRecordRespVO> getSupervisionRecordPage(EvalSupervisionRecordPageReqVO pageReqVO);

    /**
     * 提交督导报告
     *
     * @param recordId 记录ID
     * @param reportContent 报告内容
     */
    void submitSupervisionReport(Long recordId, String reportContent);

    /**
     * 获取异常预警列表
     *
     * @param planId 计划ID
     * @return 预警列表
     */
    List<EvalExceptionAlertRespVO> getExceptionAlerts(Long planId);

    /**
     * 处理异常预警
     *
     * @param alertId 预警ID
     * @param handleReqVO 处理信息
     */
    void handleExceptionAlert(Long alertId, @Valid EvalExceptionAlertHandleReqVO handleReqVO);

    /**
     * 获取监控数据历史
     *
     * @param planId 计划ID
     * @param dataType 数据类型
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 历史数据
     */
    List<EvalMonitoringDataHistoryRespVO> getMonitoringDataHistory(Long planId, String dataType, String startTime, String endTime);

    /**
     * 考生签到
     *
     * @param checkinReqVO 签到信息
     */
    void checkinCandidate(@Valid EvalCandidateCheckInReqVO checkinReqVO);

    /**
     * 考生签退
     *
     * @param candidateId 参评人员ID
     */
    void checkoutCandidate(Long candidateId);

    /**
     * 获取考勤记录
     *
     * @param planId 计划ID
     * @param candidateId 参评人员ID
     * @param attendanceStatus 考勤状态
     * @return 考勤记录列表
     */
    List<EvalAttendanceRespVO> getAttendanceRecords(Long planId, Long candidateId, Integer attendanceStatus);

    /**
     * 添加监控数据
     *
     * @param saveReqVO 监控数据
     */
    void addMonitoringData(@Valid EvalMonitoringDataSaveReqVO saveReqVO);

    /**
     * 获取监控数据
     *
     * @param planId 计划ID
     * @param dataType 数据类型
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 监控数据
     */
    List<EvalMonitoringDataHistoryRespVO> getMonitoringData(Long planId, String dataType, String startTime, String endTime);

    /**
     * 获取监控预警
     *
     * @param planId 计划ID
     * @param alertLevel 预警级别
     * @return 预警列表
     */
    List<EvalMonitoringAlertRespVO> getMonitoringAlerts(Long planId, Integer alertLevel);

    /**
     * 获取督导记录
     *
     * @param planId 计划ID
     * @param supervisorId 督导员ID
     * @return 督导记录列表
     */
    List<EvalSupervisionRecordRespVO> getSupervisionRecords(Long planId, Long supervisorId);

    /**
     * 获取督导记录详情
     *
     * @param recordId 记录ID
     * @return 督导记录详情
     */
    EvalSupervisionRecordRespVO getSupervisionRecord(Long recordId);

    /**
     * 获取督导统计
     *
     * @param planId 计划ID
     * @return 督导统计
     */
    EvalSupervisionStatisticsRespVO getSupervisionStatistics(Long planId);

    /**
     * 获取计划实时状态
     *
     * @param planId 计划ID
     * @return 实时状态
     */
    EvalPlanRealTimeStatusRespVO getPlanRealTimeStatus(Long planId);

    /**
     * 获取异常记录
     *
     * @param planId 计划ID
     * @return 异常记录列表
     */
    List<EvalExceptionRecordRespVO> getExceptionRecords(Long planId);

    /**
     * 批量签到考生
     *
     * @param batchCheckinReqVO 批量签到信息
     */
    void batchCheckinCandidates(@Valid EvalAttendanceBatchCheckinReqVO batchCheckinReqVO);

    /**
     * 处理监控预警
     *
     * @param alertId 预警ID
     * @param handleReqVO 处理信息
     */
    void handleMonitoringAlert(Long alertId, @Valid EvalMonitoringAlertHandleReqVO handleReqVO);

    /**
     * 更新实时状态
     *
     * @param updateReqVO 更新信息
     */
    void updateRealTimeStatus(@Valid EvalRealTimeStatusUpdateReqVO updateReqVO);

    /**
     * 报告异常
     *
     * @param reportReqVO 异常报告信息
     * @return 异常记录ID
     */
    Long reportException(@Valid EvalExceptionReportReqVO reportReqVO);

    /**
     * 处理异常
     *
     * @param exceptionId 异常ID
     * @param handleReqVO 处理信息
     */
    void handleException(Long exceptionId, @Valid EvalExceptionHandleReqVO handleReqVO);

}
